package com.atguigu.lease.admin.task;

import com.atguigu.lease.admin.service.LeaseAgreementService;
import com.atguigu.lease.model.bean.LeaseAgreement;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Component
public class WebAdminTask {
    //springtask 定时任务支持 6位表达式
    // cron表达式：  秒  分  时  日 月 周
    // 以后的分布式定时任务支持7位： 秒  分  时  日 月 周 年     周和年不能同时使用* ，必须有一个使用?
//    @Scheduled(cron = "0/5 * * * * ?") //* 表示所有   0/5 从第0秒开始 每过5秒执行一次    5,6,10,20 写在cron表达式第一位 表示 第5 6 10 20秒歌执行一次定时任务
//    public void test(){
//        System.out.println(new Date());
//    }
    //redis的过期键策略： 惰性删除、定期删除(每过一段时间 抽取一部分键判断数据是否过期 如果过期删除)
    /*
        房间退租需要用户主动发起
        1、已签约的房间，如果已到期 将租约的状态修改为 4 已到期
        2、如果退租待确认的房间，用户一直未确认， 如果已到期 将租约的状态改为6 已退租
     */
    @Autowired
    LeaseAgreementService leaseAgreementService;
    // 每天凌晨2:00:00  服务器闲时  使用定时任务 检查所有的租约，如果租约过期 更新租约状态为 已过期的状态
    @Scheduled(cron = "0 0 2 * * ?")
    public void checkLeaseAgreementStatus(){
        //1、查询所有的状态有效但是已过期租约： 租约过期时间小于当前时间(租约已过期)
        //  where status in (2,5) and lease_end_date < '2025-09-27 02:00:00'
        // 如果租约的过期时间是 2025-09-27  这个字符串小于 2025-09-27 02:00:00 ，能够被查询出来  ，判断为过期，这个逻辑错误！

        List<LeaseAgreement> leaseAgreements = leaseAgreementService.list(Wrappers.lambdaQuery(LeaseAgreement.class)
                .in(LeaseAgreement::getStatus, 2, 5)
                .lt(LeaseAgreement::getLeaseEndDate , new SimpleDateFormat("yyyy-MM-dd")
                        .format(new Date()) ));
        if(CollectionUtils.isEmpty(leaseAgreements)){
           return;
        }
        //2、查询到了已过期的租约：修改租约的状态
        leaseAgreements.forEach(leaseAgreement -> {
            if(leaseAgreement.getStatus().equals(2)){
                leaseAgreement.setStatus(4);
            }else{
                leaseAgreement.setStatus(6);
            }
        });
        //批量更新
        leaseAgreementService.updateBatchById(leaseAgreements);


//        //2、判断租约是否过期，如果过期更新状态
//        leaseAgreements.forEach(leaseAgreement -> {
//            //将租约的过期时间转为date对象：  如果leaseAgreement的leaseEndDate是Date类型 不需要转换！！！！
//            try {
//                Date leaseEndDate = new SimpleDateFormat().parse(leaseAgreement.getLeaseEndDate());
//
//            } catch (ParseException e) {
//                throw new RuntimeException(e);
//            }
//        });
    }
}
